
#include "n32l40x.h"
#include "sys_param.h"

SYS_PARAM_t sys_data;


/******************************************
 * 设置斩脂刀的 在线状态
 **********************************************/ 
void set_zhan_zhi_dao_state(ZHANZHI_DAO_STA_e active_flag)
{
    sys_data.zhan_zhi_dao_online_flag = active_flag;
}
/******************************************
 * 设置斩脂刀的 在线状态
 * *************************************/ 
ZHANZHI_DAO_STA_e get_zhan_zhi_dao_state(void)
{
    return sys_data.zhan_zhi_dao_online_flag;
}


/*******************************************************
 * 设置 负载状态
 * 
 ********************************************************/ 
void set_sys_load_state(uint8_t active_flag)
{
    sys_data.load_active_flag = active_flag;
}

uint8_t get_sys_load_state(void)
{
    return sys_data.load_active_flag;
}

// 获取电池电量
int get_sys_battery_voltage(void)
{
    return sys_data.bat_val;
}

void set_sys_battery_voltage(int bat_val)
{
    sys_data.bat_val = bat_val;
}

RGB_COLOR_e get_sys_rgb_color(void)
{
    return sys_data.rgb_color;
}

void set_sys_rgb_color(RGB_COLOR_e color)
{
    sys_data.rgb_color = color;
}

LEVEL_e get_sys_level(void)
{
    return sys_data.level;
}

void set_sys_level(LEVEL_e level)
{
    sys_data.level = level;
}
// 系统工作在那几种输出模式（头部模式，眼部模式，脸部模式等）
WORK_MODE_e get_sys_mode(void)
{
    return sys_data.mode;
}

void set_sys_mode(WORK_MODE_e mode)
{
    sys_data.mode = mode;
}

// 系统异常类型，[电池电压低， ntc1-4异常，输出短路等]）



void clear_sys_err_mode(ERR_MODE_e err_mode)
{
    sys_data.err_mode &= ~err_mode;
}

void set_sys_err_mode(ERR_MODE_e err_mode)
{
    sys_data.err_mode |= err_mode;
}

ERR_MODE_e get_sys_err_mode(void)
{
    return sys_data.err_mode;
}

// 系统工作在那几种状态（充电，睡眠，关机，正常工作，异常警告等）

DEVICE_STA_e get_sys_state(void)
{
    return sys_data.sta;
}

void set_sys_state(DEVICE_STA_e mode)
{
    sys_data.sta = mode;
}

/***********************************
 * 设置hf 输出flag
 * 
 */
void set_sys_hf_flag(uint8_t output_flag)
{
    sys_data.hf_output_flag = output_flag;
}

uint8_t get_sys_hf_flag(void)
{
    return sys_data.hf_output_flag;
}
/***********************************
 * 低电 关机标志位
 * 
 ********************************/
void set_sys_bat_lowest_flag(uint8_t flag)
{
    sys_data.bat_lowest_flag = flag;
}
uint8_t get_sys_bat_lowest_flag(void)
{
    return sys_data.bat_lowest_flag;
}



/***********************************
 * 20ms 进入一次 
 * 
 */
void sys_color_select(void)
{
    static int low_3v4_cnt = 95;    // 防止低电刚开机时，刚开机还是显示绿灯
    static int high_3v4_cnt = 195;

    if((CHARGE_STA == get_sys_state())||(SLEEP_STA == get_sys_state())||(CHARGE_FINISH_STA == get_sys_state())){
        set_sys_rgb_color(BLACK_COLOR);
        return;
    }

    //电压异常时，显示红色
    if(((get_sys_err_mode()) & BAT_LOW)||((get_sys_err_mode()) & BAT_LOWEST)){
        if(RED_COLOR != get_sys_rgb_color()){
            set_sys_rgb_color(RED_COLOR);
        } 
    }   
    else {
        // 正常时，显示 绿色
        if(GREEN_COLOR != get_sys_rgb_color()){
            set_sys_rgb_color(GREEN_COLOR);
        } 
    }
}

/****************************************************
 * 
 *  进入err状态，和从err 状态中退出
 * 
 **********************************************/

void sys_sta_check(void)
{
    static uint8_t sta_change_flag = 0;

    if((CHARGE_STA == get_sys_state())||(SLEEP_STA == get_sys_state())||(CHARGE_FINISH_STA == get_sys_state())){
        return;
    }

    if(get_sys_err_mode()){
        if((get_sys_err_mode()&BAT_LOW) == 0){
            // if(ERR_STA != get_sys_state()){
            if(get_sys_err_mode()&BAT_LOWEST){
                sys_data.last_sta = get_sys_state();
                sta_change_flag = 1;
                set_sys_state(ERR_STA); 
            }
        }
    }
    else if(sta_change_flag){
        set_sys_state(sys_data.last_sta);
        sta_change_flag = 0;
    }
}

/***************************************************
 * 
 * 获取该模式下的运行时长
 * * 
 *********************************************/
int get_cur_mode_run_cnt(void)
{
    return sys_data.cur_mode_run_cnt;
}

/***************************************************
 * 
 * 档位 +/- ,不会清除该模式下的运行时长
 * * 
 *********************************************/
void clear_cur_mode_run_cnt(void)
{
    sys_data.cur_mode_run_cnt = 0;
}

/***************************************************
 * 
 ** 切换模式时，会将该值清0
 *****************************************************/
void clear_idle_cnt(void)
{
    sys_data.check_load_cnt = 0;
    sys_data.idle_sta_cnt = 0;
    sys_data.cur_mode_active_online_flag = 0;
}

/***************************************************
 * 
 ** 切换模式时，会将该值清0
 *****************************************************/
static void change_to_idle_sta(void)
{
    motor_long_on();
    set_sys_level(LEVEL_0);
    set_sys_state(SYS_IDLE_STA);
    sys_data.idle_sta_cnt = 0;
}

/****************************************************
 * 
 * 系统 进入idle判断
 * 模式完成震动跳转1级提示灯，然后进入待机状态，头部灯保持常亮：当该模式作用时长达到官方设定时间后，主机震动并跳转回到1级提示灯；可通过调整模式及档位启动。
   Ⅰ.FACE 脸部模式   当进入模式后，接触肌肤后带载启动计时，当前累计计时到5分钟完成后提醒
   Ⅱ.BODY 身体模式   当进入模式后，接触肌肤后带载启动计时，累计计时到5分钟完成后提醒
   Ⅲ.HAIR 头皮模式   当进入模式后，接触肌肤后带载启动计时，累计计时到5分钟完成后提醒
   Ⅳ.MAX+ 强力模式   单用/结合功能头时，当进入模式后，接触肌肤后带载启动计时，累计计时到5分钟完成后提醒
 **********************************************/
void sys_auto_enter_idle_sta_check(void)
{
   
    switch(get_sys_state())
    {
    case NORMAL_WORK_STA:{
        sys_data.check_load_cnt ++;
    
        if(sys_data.check_load_cnt <= 60){
            sys_data.cur_mode_active_online_flag = get_sys_load_state();    
            if(sys_data.check_load_cnt == 60){
                if(0 == sys_data.cur_mode_active_online_flag){
                    change_to_idle_sta();
                }
            }
            if(sys_data.cur_mode_active_online_flag){
                sys_data.check_load_cnt = 61;    
            }
        }
    
        if(sys_data.cur_mode_active_online_flag){

            sys_data.cur_mode_run_cnt ++;
            switch (get_sys_mode())
            {
            case FACE_MODE:{ 
                if(sys_data.cur_mode_run_cnt > FACE_MODE_MAX_TIME){
                    change_to_idle_sta();
                }
                break;
            }

            case BODY_MODE:{
                if(sys_data.cur_mode_run_cnt > BODY_MODE_MAX_TIME){
                    change_to_idle_sta();
                }
                break;
            }
            case HAIR_MODE:{
                if(sys_data.cur_mode_run_cnt > HAIR_MODE_MAX_TIME){
                    change_to_idle_sta();
                }
                break;
            }
            case MAX_MODE:{
                if(sys_data.cur_mode_run_cnt > MAX_MODE_MAX_TIME){
                    change_to_idle_sta();
                }
                break;
            }
            default:
                break;
            }
        }
        break;
    }

        case SYS_IDLE_STA:{
            sys_data.idle_sta_cnt ++;
            break;
        }
        default:{
            sys_data.idle_sta_cnt = 0;
        }
    }
}
/****************************************************
 * 1秒调用一次
 * 
 * 系统进入sleep判断
 *  1. 强制关机：累计开机达到30分钟，则自动判定进行强制关机，如需使用需重新开机使用。
 *  2. idle 模块下，待机：无任何操作超过180秒，自动关闭仪器
 *  3. 低电情况下，闪烁5次后关机 
 **********************************************/
void sys_auto_power_off_check(void)
{
    if((CHARGE_STA == get_sys_state())||(CHARGE_FINISH_STA == get_sys_state())){
        return;
    }
    
    // 1. 运行达到30min，强制关机 
    if(sys_data.run_time > 60*30){
        if(NORMAL_WORK_STA == get_sys_state()){
            // sys_data.auto_sleep_flag = 1;
            motor_shor_on();
            set_sys_state(SLEEP_STA);
            buzzer_on_with_param(5, 5, 3);
            
        }
    }

    if(SYS_IDLE_STA == get_sys_state()){
        if(sys_data.idle_sta_cnt > 180){
            // sys_data.auto_sleep_flag = 1;
            motor_shor_on();
            set_sys_state(SLEEP_STA);
            buzzer_on_with_param(5, 5, 3);
        }
    }

   //----低电状态，进入power-off  

    if(get_sys_err_mode()){
        sys_data.err_cnt ++;
        if((get_sys_err_mode())& BAT_LOWEST){
        
            if(sys_data.err_cnt > 5){
                sys_data.err_cnt = 0;
                // sys_power_off();
                printf("bat_lowest sleep \r\n");
                // sys_data.auto_sleep_flag = 1;
                // if(NORMAL_WORK_STA == get_sys_state()){
                    my_buzzer_init();
                    motor_shor_on();
                    buzzer_on_with_param(5, 5, 3);
                // }
                set_sys_state(SLEEP_STA);
            } 
        }
    }
    else{
        sys_data.err_cnt = 0;
    }
}


